package com.sudo.boot.admin._sys;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.lang.tree.Tree;
import com.sudo.boot.base.pojo.JsonRes;
import com.sudo.boot.mapper.sys.model.bo.*;
import com.sudo.boot.mapper.sys.model.vo.SysMenuDetailVo;
import com.sudo.boot.satoken.util.BootStpUtil;
import com.sudo.boot.service.sys.SysMenuService;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 系统菜单  控制层。
 *
 * @author admins
 * @since 2023-10-13
 */
@RestController
@RequestMapping("/sys-menu")
public class SysMenuController {

    @Resource
    private SysMenuService sysMenuService;

    /**
     * 新增一级菜单
     *
     * @param bo 系统菜单
     */
    @SaCheckPermission("menu_add")
    @PostMapping("add")
    public JsonRes<Void> add(@RequestBody @Validated SysMenuBoAdd bo) {
        sysMenuService.add(bo);
        return JsonRes.ok();
    }

    /**
     * 新增子菜单
     *
     * @param bo 系统菜单
     */
    @SaCheckPermission("menu_add")
    @PostMapping("addSub")
    public JsonRes<Void> addSub(@RequestBody @Validated SysMenuBoAddSub bo) {
        sysMenuService.addSub(bo);
        return JsonRes.ok();
    }

    /**
     * 编辑菜单 。
     *
     * @param bo 菜单信息
     */
    @SaCheckPermission("menu_edit")
    @PostMapping("edit")
    public JsonRes<Void> edit(@RequestBody @Validated SysMenuBoEdit bo) {
        sysMenuService.edit(bo);
        return JsonRes.ok();
    }
    /**
     * 根据主键删除系统菜单 。（存在子级则不能删除）
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @SaCheckPermission("menu_remove")
    @DeleteMapping("remove/{id}")
    public JsonRes<Void> remove(@PathVariable Integer id) {
        sysMenuService.deleteById(id);
        return JsonRes.ok();
    }


    /**
     * 菜单状态切换 。
     *
     * @param bo 菜单信息
     */
    @SaCheckPermission("menu_status")
    @PostMapping("status")
    public JsonRes<Void> status(@RequestBody @Validated SysMenuBoStatus bo) {
        sysMenuService.status(bo);
        return JsonRes.ok();
    }


    /**
     * 根据系统菜单 主键获取详细信息。
     *
     * @param id 系统菜单 主键
     * @return 系统菜单 详情
     */
    @GetMapping("detail/{id}")
    public JsonRes<SysMenuDetailVo> detail(@PathVariable Long id) {
        SysMenuDetailVo detailVo = sysMenuService.detail(id);
        return JsonRes.ok(detailVo);
    }

    /**
     * 获取所有系统菜单的树状结构
     *
     * @return 系统菜单 树状结构
     */
    @GetMapping("selectAllSysMenuTree")
    public JsonRes<List<Tree<String>>> selectAllSysMenuTree() {
        List<Tree<String>> treeList = sysMenuService.selectAllSysMenuTree();
        return JsonRes.ok(treeList);
    }

    /**
     * 获取所有系统菜单的树状结构
     *
     * @return 系统菜单 树状结构
     */
    @GetMapping("selectAllForLayMenuTree")
    public JsonRes<List<Tree<String>>> selectAllForLayMenuTree() {
        List<Tree<String>> treeList = sysMenuService.selectAllForLayMenuTree();
        return JsonRes.ok(treeList);
    }

    /**
     * 根据roleId获取所有系统菜单代码
     *
     * @return 系统菜单 List<String>
     */
    @GetMapping("selectMenuIdListByRoleId/{roleId}")
    public JsonRes<List<Integer>> selectMenuIdListByRoleId(@PathVariable Integer roleId) {
        List<Integer> treeList = sysMenuService.selectMenuIdListByRoleId(roleId);
        return JsonRes.ok(treeList);
    }

    /**
     * 根据roleCode获取菜单按钮权限
     *
     * @return 系统菜单 树状结构
     */
    @GetMapping("checkMenuAuth")
    public JsonRes<Void> checkMenuAuth(@RequestParam("menuCode") String menuCode) {
        String currRoleCode = BootStpUtil.getCurrRole();
        sysMenuService.checkMenuAuth(currRoleCode,menuCode);
        return JsonRes.ok();
    }
}
